﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpPickInterface.h"
#include "OwnerPtr.h"
#include "IObject.h"

namespace gcmp
{
    class IElement;

    /// \brief 控制在ModifyAction中Element的图形表达是否可以被拾取
    ///
    /// 平台内部的ActionModify中会使用特定的IPickFilter，该PickFilter在判断Element的图形表达（包含子节点）是否能被拾取时，会询问IElementCanBePickedInModifyAction。
    /// 全局最多有一个IElementCanBePickedInModifyAction对象，如果上层产品没有注册过，则询问结果返回true。
    /// \see ActionModifyInput IPickFilter
    class GCMP_PICK_INTERFACE_EXPORT IElementCanBePickedInModifyAction : public IObject
    {
    public:
        /// \brief 查询是否启用
        /// \return bool 返回是否启用
        virtual bool IsEnabled() const = 0;

        /// \brief 设置启用或停用
        /// \param isEnabled 启用或停用
        /// \return bool 设置是否成功
        virtual bool SetIsEnabled(bool isEnabled) = 0;

        /// \brief 告知给定的Element的图形表达(包含子节点）是否可被拾取
        /// \param pElement 指定的Element
        /// \return 是否可以被拾取
        virtual bool CanBePicked(const IElement * pElement) const = 0;

        /// \brief 克隆
        ///
        /// \return 克隆出的对象
        virtual OwnerPtr<IElementCanBePickedInModifyAction> Clone() const = 0;

        /// \brief 析构函数
        virtual ~IElementCanBePickedInModifyAction() = 0;

    public:
        /// \brief 获取全局最多一个的IElementCanBePickedInModifyAction对象
        /// \return IElementCanBePickedInModifyAction * 如不存在，返回空
        static IElementCanBePickedInModifyAction * Get();

        /// \brief 注册IElementCanBePickedInModifyAction对象
        /// \return bool 是否设置成功
        static bool Set(OwnerPtr<IElementCanBePickedInModifyAction> opElementCanBePickedInModifyAction);
    };
}

